#include "boot.h"
#include "variable.h"

uint16_t binPacketTotal;			// bin文件消息分包数量
uint16_t binPacketIndex;			// bin文件当前请求包序号
uint16_t binPacketIndexLast;	// bin文件上一次请求包序号（用来判定是否还在继续更新）
uint16_t LocalVersion;
uint16_t appFlag=UPDATE_START;				// APP当前的状态

typedef void (*iapfun)(void);

__asm void MSR_MSP(uint32_t addr)
{
	MSR MSP, r0
	BX r14
}

void jump2app(uint32_t appxaddr)
{
	__disable_irq();   // 关闭中断，防止进入APP时出现问题
	uint32_t add = ((*(volatile uint32_t*)appxaddr)&0x2FFE0000);
	if(add == 0x20000000)
	{
		iapfun jump2app = (iapfun)*(volatile uint32_t*)(appxaddr+4);  //  // 程序烧写首地址+4   复位中断
		MSR_MSP(*(volatile uint32_t*)appxaddr); // 初始化栈顶
		(*jump2app)();
	}
}

void jump2fun(uint32_t funaddr)
{						
	iapfun jump2fun = (iapfun)*(volatile uint32_t*)(funaddr+1); // 函数地址+1
	MSR_MSP(*(volatile uint32_t*)0x08005000);   // 初始化栈顶  程序烧写的首地址
	(*jump2fun)();
}

